
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>1、SpringAI快速入门 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>1、SpringAI快速入门 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">Spring AI框架的核心设计思想是什么？它如何简化与不同AI服务的交互？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AI的核心设计思想是提供一个统一的抽象层。它通过提供一致的API接口，屏蔽了不同AI服务之间的差异，使得开发者可以使用统一的方式与各种AI模型进行交互，而无需关心底层具体实现的区别。</div>
          </div>
          <div class="card-source">来源: 1. Spring AI 框架概览</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">Spring AI框架提供了哪些生产级的特性来增强应用的稳定性和可靠性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AI内置了多种生产级特性，包括重试机制、速率限制和错误处理等，这些功能帮助开发者构建更加健壮和可靠的企业级AI应用。</div>
          </div>
          <div class="card-source">来源: 1. Spring AI 框架概览</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当应用场景对数据隐私有极高要求或需要离线运行时，Spring AI支持哪种AI服务？其主要特点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在这种场景下，可以使用Ollama。其主要特点是支持在本地部署开源模型，从而避免了对外部API的调用，保证了数据隐私和离线运行能力。</div>
          </div>
          <div class="card-source">来源: 支持的AI服务与模型列表及特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">文档中提到了哪些管理API密钥的最佳实践，以避免在代码中硬编码密钥？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到的最佳实践包括：1. 使用环境变量；2. 通过配置文件引用环境变量；3. 使用Spring Cloud Config进行集中管理；4. 使用Vault等密钥管理服务；5. 遵循最小权限原则并定期轮换密钥。</div>
          </div>
          <div class="card-source">来源: API密钥管理最佳实践</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring AI如何与Spring Boot生态无缝集成以简化开发流程？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AI通过提供Spring Boot starter依赖实现快速功能引入和自动配置，从而减少样板代码。同时，它还可以利用Spring的依赖注入（IoC）、属性配置（application.yml）和AOP等核心特性，简化AI组件的管理、配置和监控。</div>
          </div>
          <div class="card-source">来源: 与Spring生态的无缝集成优势</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在使用Spring AI 0.8.0版本时，对Spring Boot的版本有什么具体要求？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">确保Spring Boot和Spring AI版本兼容是必要的。文档指出，Spring AI 0.8.0+版本需要与Spring Boot 3.2.0+版本配合使用。</div>
          </div>
          <div class="card-source">来源: Maven/Gradle依赖配置与版本选择</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在Spring AI应用中，如果遇到模型调用超时的问题，应该如何排查和解决？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">模型调用超时的症状是请求超时异常。解决方法是在应用的配置文件（如application.yml）中增加连接和读取的超时设置，例如调整`spring.ai.openai.connect-timeout`和`spring.ai.openai.read-timeout`的值。</div>
          </div>
          <div class="card-source">来源: 测试方法与常见问题排查指南</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在代码层面，如何使用Spring AI向AI模型发起一个简单的对话请求？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">首先，注入一个AI客户端实例（如`OpenAiChatClient`）。然后，创建一个`Prompt`对象来封装用户的输入消息。最后，调用客户端的`call`方法并传入该`Prompt`对象，即可获得模型的响应结果。</div>
          </div>
          <div class="card-source">来源: 简单对话功能的代码示例</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当应用收到来自AI服务的“429 Too Many Requests”错误时，Spring AI提供了什么机制来处理这种情况？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring AI提供了内置的重试机制来处理请求速率限制问题。开发者可以在配置文件中设置重试次数（`max-attempts`）、初始间隔（`initial-interval`）和间隔乘数（`multiplier`），使应用在收到429错误时能够自动进行退避重试。</div>
          </div>
          <div class="card-source">来源: 测试方法与常见问题排查指南</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
